package com.hanamaki.demo02;

import org.apache.commons.io.FileUtils;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Action;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.Select;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.List;

/**
 * 1.测试 Selenium中 双击的事件
 */
public class SeleniumTemplate01 {

    //注册驱动
    /**
     * driver代表浏览器对象
     */
    WebDriver driver;
    @BeforeMethod
    public void setUp() {
        //注册本地火狐打开的位置
        System.setProperty("webdriver.gecko.driver", "C:\\Program Files\\Mozilla Firefox\\geckodriver.exe");
        //初始化
        driver = new FirefoxDriver();
    }


    /**
     * 测试  元素 双击
     * @throws InterruptedException
     * @throws MalformedURLException
     */
    @Test
    public void test() throws InterruptedException, MalformedURLException {
        /* 打开资源路径的位置 */
        driver.get("file:///C:/Users/edz/Desktop/testhtml/exam/House.html");
        /* 定位 物业名称对话框实现双击的操作  xpath：//input[@type='text'] */
        WebElement wymc = driver.findElement(By.xpath("//input[@type='text']"));
        /* 如果想要使用双击操作 ，要使用 Actions  */
        Actions actions = new Actions(driver);
        actions.doubleClick(wymc).build().perform();
    }


    /**
     * 测试下拉列表框  点击元素
     */
    @Test
    public void select() {

        /* 打开资源路径的位置 */
        driver.get("file:///C:/Users/edz/Desktop/testhtml/exam/House.html");

        /* 物业类别   租金范围  */
        /* 物业类别默认 支持多选   使用 multiple 可以支持多选  */

        /* 第一种 使用 xpath方式 点击 办公用房   //option[@value='c']    */
//        WebElement bgyf = driver.findElement(By.xpath("/html/body/table[1]/tbody/tr[2]/td[2]/select/option[3]"));
//        bgyf.click();

        /* 第二种，使用容器 来获取需要点击的元素   */
        /*      1. 需要定位 元素所在的列表 ，将列表添加至 容器中，使用容器内置的方法来选择想要使用的 元素*/
        /*       2. 定位 下拉列表框*/
        WebElement list1 = driver.findElement(By.xpath("//select[@name='list1']"));
        /*       3. 将找到的下拉列表 添加至 （Select）容器中 */
        Select select = new Select(list1);
        /*   4. 选择元素 */
        /*    4.1 通过  元素 在容器中的下标来选择 下标从0开始 */
        /*select.selectByIndex(0);*/
        /*    4.2 通过元素的 value 值来选择  */
        /*select.selectByValue("c");*/
        /*    4.3 通过 元素 具体显示在网页中的文本来获取 */
        select.selectByVisibleText("商场");

    }


    /**
     * 测试下拉列表框  点击元素
     */
    @Test
    public void zjfw() {

        /* 打开资源路径的位置 */
        driver.get("file:///C:/Users/edz/Desktop/testhtml/exam/House.html");

        /*   租金范围  */


        /* 第二种，使用容器 来获取需要点击的元素   */
        /*      1. 需要定位 元素所在的列表 ，将列表添加至 容器中，使用容器内置的方法来选择想要使用的 元素*/
        /*       2. 定位 下拉列表框*/
        WebElement list2 = driver.findElement(By.xpath("//select[@name='list2']"));
        /*       3. 将找到的下拉列表 添加至 （Select）容器中 */
        Select select = new Select(list2);
        /*   4. 选择元素 */
        /*    4.1 通过  元素 在容器中的下标来选择 下标从0开始 */
        /*select.selectByIndex(0);*/
        /*    4.2 通过元素的 value 值来选择  */
        /*select.selectByValue("w3");*/
        /*    4.3 通过 元素 具体显示在网页中的文本来获取 */
        select.selectByVisibleText("4000");

    }

    /**
     * 测试下拉列表框  点击元素
     */
    @Test
    public void zjfw_for() {

        /* 打开资源路径的位置 */
        driver.get("file:///C:/Users/edz/Desktop/testhtml/exam/House.html");

        /*   租金范围  */


        /* 第二种，使用容器 来获取需要点击的元素   */
        /*      1. 需要定位 元素所在的列表 ，将列表添加至 容器中，使用容器内置的方法来选择想要使用的 元素*/
        /*       2. 定位 下拉列表框*/
        WebElement list2 = driver.findElement(By.xpath("//select[@name='list2']"));
        /*       3. 将找到的下拉列表 添加至 （Select）容器中 */
        Select select = new Select(list2);

        /* 数据库操作  查询出来 当前人的  租金为 4000  就要在租金范围中选择对应的 租金 */
        String money = "30000";

        List<WebElement> options = select.getOptions();
        for (WebElement option : options) {
            /* 可以通过 getText() 来获取 元素的名称 */
            System.out.println(option.getText());
            if (option.getText().equals(money)) {
                option.click();
            } else {
                System.out.println("元素未找到！");
            }
        }


    }

    /**
     *  测试 判断 下拉列表框是否支持多选
     */
    @Test
    public void is_multiple() {

        /* 打开资源路径的位置 */
        driver.get("file:///C:/Users/edz/Desktop/testhtml/exam/House.html");


        WebElement list1 = driver.findElement(By.xpath("//select[@name='list1']"));
        WebElement list2 = driver.findElement(By.xpath("//select[@name='list2']"));

        Select select1 = new Select(list1);
        Select select2 = new Select(list2);

        System.out.println(select1.isMultiple());
        System.out.println(select2.isMultiple());

        // getAllSelectedOptions() 可以获取当前下拉列表框中已经选中的数据
        List<WebElement> allSelectedOptions = select1.getAllSelectedOptions();
        for (WebElement allSelectedOption : allSelectedOptions) {

            // getText() 可以获得元素的文本值
            String text = allSelectedOption.getText();
            System.out.println(text);

        }


    }

    /**
     *  测试 文件上传   以及截图的使用
     */
    @Test
    public void upload_file() throws IOException {

        /* 打开资源路径的位置 */
        driver.get("file:///C:/Users/edz/Desktop/testhtml/exam/House.html");

        /* 需要定位文件上传 元素 */
        WebElement file = driver.findElement(By.xpath("//input[@type='file']"));
        /* 想要上传文件 只需要填写 文件所在的 路径即可  */
        file.sendKeys("C:\\Users\\edz\\IdeaProjects\\SeleniumStudy\\src\\com\\hanamaki\\demo02\\SeleniumTemplate01.java");


        /* 测试 selenium截图的使用   TakesScreenshot. */
        File screenshotAs = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);

        /* 保存在本地 */
        /* 工具类 FileUtils */
        /* 定义一个 保存截图的路径 */
        File file1 = new File("D://test.png");
        FileUtils.copyFile(screenshotAs, file1);


    }

    @AfterClass
    public void close() {
//        driver.quit();
    }
}
